#ifndef ORG_WXW0303_SYMBOL_DB_SYMINFOTABLE_H
#define ORG_WXW0303_SYMBOL_DB_SYMINFOTABLE_H

#include <sqlite3.h>
#include <string>


struct SymInfo;

/**
 * SymInfoTable;就是存放着 SymInfo 对象的表.
 * 其对象是全局唯一的.
 */
struct SymInfoTable {
    enum {
        LANGUAGE = 0x01U,
        DOC = 0x02U,
        ALL = LANGUAGE | DOC
    };

    /// SymInfoTable 使用 id_t 来存放表内每一个 SymInfo 对象对应的 ID.
    typedef sqlite3_int64 id_t;

    /// 获取全局唯一对象的引用.
    static SymInfoTable& instance();

    /// 将 syminfo 插入到表中,并将其在表中的 ID 存放到 syminfo.id_ 中.
    void insert(SymInfo &syminfo);
    /// 从表中移除 ID 为 symid 的记录.
    void remove(id_t symid);
    /// 从表中获取 ID 为 symid 的记录,并存入到 syminfo 中.
    void get(id_t symid,SymInfo &syminfo);

    /**
     * 修改 id 为 symid 的记录.
     * @param syminfo 存放着待修改的结果.
     * @param flags 标志位,指定了要修改那些域.具体如下:
     *  o LANUGAGE,修改 LANGUAGE 域.
     *  o DOC,修改 DOC 域.
     *  o ALL,修改所有域,当然除了 symid 域不被修改.
     */
    void modify(id_t symid,const SymInfo &syminfo,unsigned flags);
private:
    // 禁止 SymInfoTable 对象被拷贝,或者被赋值.
    SymInfoTable(const SymInfoTable&) = delete;
    SymInfoTable(SymInfoTable &&) = delete;
    SymInfoTable& operator=(const SymInfoTable&) = delete;
    SymInfoTable& operator=(SymInfoTable &&) = delete;

    SymInfoTable();
};

/**
 * SymInfo;符号信息,存放着其在 SymInfoTable 中的 id,符号所属语言,以及符号的介绍信息.
 */
struct SymInfo {
    friend class SymInfoTable;
public:
    const std::string& language() const
    {
        return language_;
    }

    void setLanguage(const std::string &value)
    {
        language_ = value;
    }

    SymInfoTable::id_t id() const
    {
        return id_;
    }

    const std::string& doc() const
    {
        return doc_;
    }

    void setDoc(const std::string &doc)
    {
        doc_ = doc;
    }

private:
    void setId(SymInfoTable::id_t value)
    {
        id_ = value;
    }

private:
    SymInfoTable::id_t id_;
    std::string language_;
    std::string doc_;
};

#endif // ORG_WXW0303_SYMBOL_DB_SYMINFOTABLE_H

